Linux 下的 I2C 编程

I2C 简介

I2C(Inter Integrated Circuit)总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。I2C 总线包含两根信号线,双向数据线 SDA,时钟线 SCL)。

它的物理层有如下特点:

  • 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。 在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
  • 一个 I2C 总线只使用两条总线线路,一条双向串行数据线 (SDA) ,一条串行时钟线 (SCL)。 数据线即用来表示数据,时钟线用于数据收发同步。
  • 每个连接到总线的设备都有一个独立的设备地址,主机可以利用这个地址进行不同设备之间的访问。 其中地址是一个七位或十位的数字。
  • 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲, 都输出高阻态时,由上拉电阻把总线拉成高电平。
  • 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
  • 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s , 高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。

i2c-tools

Linux 系统提供 i2c-tools 工具来对系统中的 I2C 总线进行调试,下面重要介绍 i2c-tools 的使用方法。

安装 i2c-tools

在开发板的 Linux 命令环境中通过下面命令安装:

apt install i2c-tools

i2c-tools 提供i2cdetecti2cdumpi2ctransferi2cseti2cget 命令,来操作 I2C。

i2cdetect

  • 显示所有可用的I2C总线:i2cdetect -l

    i2c-0   i2c             Synopsys DesignWare I2C adapter         I2C adapter
    
  • I2C设备查询: i2cdetect -y 0

    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: 50 -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- --
    

i2ctransfer

  • 写:i2ctransfer -f -y 0 w3@0x36 0x50 0x81 0x01
  • 读:i2ctransfer -f -y 0 w2@0x36 0x30 0x0A r3

i2cdump

通过 i2cdump 指令可导出 I2C 设备中的所有寄存器内容,例如输入 i2cdump -y 0 0x50,可获得以下内容:

No size specified (using byte-data access)
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 01 00 0d 00 84 08 e8 03 04 4a 00 00 00 00 00 00    ?.?.?????J......
10: 00 00 35 02 36 39 39 2d 38 32 31 38 30 2d 31 30    ..5?699-82180-10
20: 30 30 2d 34 31 30 20 4a 2e 30 ff ff ff ff ff ff    00-410 J.0......
30: ff ff 35 2d 66 4b 04 00 36 2d 66 4b 04 00 00 00    ..5-fK?.6-fK?...
40: 00 00 00 00 37 2d 66 4b 04 00 30 33 32 33 32 31    ....7-fK?.032321
50: 36 31 33 30 35 36 35 ff ff ff ff ff ff ff ff ff    6130565.........
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
90: ff ff ff ff ff ff 4e 56 43 42 1c 00 4d 31 00 00    ......NVCB?.M1..
a0: 35 2d 66 4b 04 00 36 2d 66 4b 04 00 37 2d 66 4b    5-fK?.6-fK?.7-fK
b0: 04 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ?...............
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 96    ...............?
i2cdump -y 0 0x50指令中,
    -y        代表取消用户交互过程,直接执行指令;
    0         代表I2C总线编号;
    0x50      代表I2C设备从机地址,此处选择配置芯片的高256字节内容。

results matching ""

    No results matching ""